package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Emp;
import com.itheima.pojo.Emprole;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import com.itheima.service.EmproleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService  {

    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmproleService emproleService;
    @Override
    public Emp login(Emp emp) {
        LambdaQueryWrapper<Emp> empLambdaQueryWrapper = new LambdaQueryWrapper<>();
        empLambdaQueryWrapper.eq(Emp::getMobile,emp.getMobile())
                .eq(Emp::getPassword,emp.getPassword());
        Emp emp1 = empMapper.selectOne(empLambdaQueryWrapper);
        return emp1;
    }
    @Override
    public Emp register(Emp emp) {
        // 检查手机号是否已存在
        LambdaQueryWrapper<Emp> empLambdaQueryWrapper = new LambdaQueryWrapper<>();
        empLambdaQueryWrapper.eq(Emp::getMobile, emp.getMobile());
        Emp existingEmp = empMapper.selectOne(empLambdaQueryWrapper);

        // 如果手机号已存在，返回null 或 自定义错误信息
        if (existingEmp != null) {
            return null; // 用户已存在，返回null或抛出异常
        }

        // 加密密码
//        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
//        String encryptedPassword = passwordEncoder.encode(emp.getPassword());
//        emp.setPassword(encryptedPassword); // 设置加密后的密码
// 设置默认值
        if (emp.getUsername() == null || emp.getUsername().equals("默认账号")) {
            // 使用时间戳或随机数生成唯一默认用户名
            String uniqueUsername = "默认账号_" + System.currentTimeMillis();
            emp.setUsername(uniqueUsername);
        }
        // 设置默认值
        if (emp.getUsername() == null) {
            emp.setUsername("默认账号");
        }
        // 获取当前最大工号
        LambdaQueryWrapper<Emp> maxWorkNumberQuery = new LambdaQueryWrapper<>();
        maxWorkNumberQuery.select(Emp::getWorkNumber).orderByDesc(Emp::getWorkNumber).last("LIMIT 1");
        Emp maxWorkNumberEmp = empMapper.selectOne(maxWorkNumberQuery);
        if (emp.getWorkNumber() == null) {
            if (maxWorkNumberEmp != null) {
                try {
                    int currentMaxWorkNumber = Integer.parseInt(maxWorkNumberEmp.getWorkNumber());
                    emp.setWorkNumber(String.valueOf(currentMaxWorkNumber + 1));
                } catch (NumberFormatException e) {
                    // 如果工号不是数字格式，使用默认值
                    emp.setWorkNumber("default_work_number");
                }
            } else {
                // 如果没有员工记录，从 20212000 开始
                emp.setWorkNumber("20212000");
            }
        }
        if (emp.getStaffPhoto() == null) {
            emp.setStaffPhoto("");
        }
        if (emp.getFormOfEmployment() == null) {
            emp.setFormOfEmployment(1); // 默认为正式员工
        }
        if (emp.getDepartmentName() == null) {
            emp.setDepartmentName("开发部");
        }
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String currentTime = now.format(formatter);

        if (emp.getTimeofentry() == null) {
            emp.setTimeofentry(currentTime);
        }
        if (emp.getCorrectionTime() == null) {
            emp.setCorrectionTime(currentTime);
        }
        if (emp.getDepartmentId() == null) {
            emp.setDepartmentId(6); // 默认部门ID
        }
        if (emp.getAge() == null) {
            emp.setAge(28); // 默认年龄
        }
        if (emp.getEducation() == null) {
            emp.setEducation("本科");
        }

        // 如果手机号不存在，则插入新用户
        empMapper.insert(emp);
        // 关联员工角色
        Emprole employeeRole = new Emprole();
        employeeRole.setEmpId(emp.getId());
        employeeRole.setRoleId(4); // 默认员工角色ID为4

        // 保存员工角色关联
        emproleService.save(employeeRole);
        // 返回注册后的用户信息（包括可能的数据库生成的id等）
        return emp;
    }

    @Override
    // 通过用户 ID 或用户名获取用户信息
    public Emp getUserByIdOrUsername(Long userId, String username) {
        // 如果传入了用户 ID，则根据 ID 查询
        if (userId != null) {
            return this.getById(userId);  // 使用 MyBatis-Plus 提供的 getById 方法
        }
        // 如果传入了用户名，则根据用户名查询
        else if (username != null && !username.isEmpty()) {
            // 通过 wrapper 查询用户（使用 MyBatis-Plus 的条件构造器）
            return this.lambdaQuery()
                    .eq(Emp::getUsername, username)
                    .one();  // 使用 one() 方法获取唯一结果
        }
        return null;  // 如果都没有传入，返回 null 或抛出异常
    }
    @Override
    public Result<Page> selectPage(Page page, String keyWord) {
        // 创建LambdaQueryWrapper来构造查询条件
        LambdaQueryWrapper<Emp> empLambdaQueryWrapper = new LambdaQueryWrapper<>();

        // 进行模糊查询，查询条件是员工姓名
        if (StringUtils.isNotBlank(keyWord)) {
            empLambdaQueryWrapper.like(Emp::getUsername, keyWord);
        }
        // 调用Mapper的selectPage方法进行分页查询
        Page page1 = empMapper.selectPage(page, empLambdaQueryWrapper);
        return Result.success(page1);
    }
    @Override
    public Integer findEmployeeIdByUsername(String username) {
        // 创建LambdaQueryWrapper来构造查询条件
        LambdaQueryWrapper<Emp> empLambdaQueryWrapper = new LambdaQueryWrapper<>();
        empLambdaQueryWrapper.eq(Emp::getUsername, username);  // 根据用户名查询员工

        // 查询数据库获取员工信息
        Emp employee = empMapper.selectOne(empLambdaQueryWrapper);

        // 如果找到了员工，则返回其 ID，否则返回 null
        return (employee != null) ? employee.getId() : null;
    }

}
